home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 1 Issue 2
/
PDCD-1 - Issue 02.iso
/
_utilities
/
utilities
/
001
/
meschach
/
!Meschach
/
h
/
sparse
< prev
next >
Wrap
Text File
|
1994-01-13
|
6KB
|
220 lines
/**************************************************************************
**
** Copyright (C) 1993 David E. Steward & Zbigniew Leyk, all rights reserved.
**
** Meschach Library
**
** This Meschach Library is provided "as is" without any express
** or implied warranty of any kind with respect to this software.
** In particular the authors shall not be liable for any direct,
** indirect, special, incidental or consequential damages arising
** in any way from use of the software.
**
** Everyone is granted permission to copy, modify and redistribute this
** Meschach Library, provided:
** 1. All copies contain this copyright notice.
** 2. All modified copies shall carry a notice stating who
** made the last modification and the date of such modification.
** 3. No charge is made for this software or works derived from it.
** This clause shall not be construed as constraining other software
** distributed on the same medium as this software, nor is a
** distribution fee considered a charge.
**
***************************************************************************/
/*
Header for sparse matrix stuff.
Basic sparse routines to be held in sparse.c
*/
/* RCS id: $Id: sparse.h,v 1.2 1994/01/13 05:33:36 des Exp $ */
#ifndef SPARSEH
#define SPARSEH
#include "matrix.h"
/* basic sparse types */
typedef struct row_elt {
int col, nxt_row, nxt_idx;
Real val;
} row_elt;
typedef struct SPROW {
int len, maxlen, diag;
row_elt *elt; /* elt[maxlen] */
} SPROW;
typedef struct SPMAT {
int m, n, max_m, max_n;
char flag_col, flag_diag;
SPROW *row; /* row[max_m] */
int *start_row; /* start_row[max_n] */
int *start_idx; /* start_idx[max_n] */
} SPMAT;
/* Note that the first allocated entry in column j is start_row[j];
This starts the chain down the columns using the nxt_row and nxt_idx
fields of each entry in each row. */
typedef struct pair { int pos; Real val; } pair;
typedef struct SPVEC {
int dim, max_dim;
pair *elt; /* elt[max_dim] */
} SPVEC;
#define SMNULL ((SPMAT*)NULL)
#define SVNULL ((SPVEC*)NULL)
/* Macro for speedup */
#define sprow_idx2(r,c,hint) \
( ( (hint) >= 0 && (hint) < (r)->len && \
(r)->elt[hint].col == (c)) ? (hint) : sprow_idx((r),(c)) )
/* memory functions */
#ifdef ANSI_C
int sp_get_vars(int m,int n,int deg,...);
int sp_resize_vars(int m,int n,...);
int sp_free_vars(SPMAT **,...);
#elif VARARGS
int sp_get_vars();
int sp_resize_vars();
int sp_free_vars();
#endif
/* Sparse Matrix Operations and Utilities */
#ifndef ANSI_C
extern SPMAT *sp_get(), *sp_copy(), *sp_copy2(),
*sp_zero(), *sp_resize(), *sp_compact();
extern double sp_get_val(), sp_set_val();
extern VEC *sp_mv_mlt(), *sp_vm_mlt();
extern int sp_free();
/* Access path operations */
extern SPMAT *sp_col_access();
extern SPMAT *sp_diag_access();
extern int chk_col_access();
/* Input/output operations */
extern SPMAT *sp_finput();
extern void sp_foutput(), sp_foutput2();
/* algebraic operations */
extern SPMAT *sp_smlt(), *sp_add(), *sp_sub(), *sp_mltadd();
/* sparse row operations */
extern SPROW *sprow_get(), *sprow_xpd(), *sprow_merge(), *sprow_mltadd(),
*sprow_resize(), *sprow_copy();
extern SPROW *sprow_add(), *sprow_sub(), *sprow_smlt();
extern double sprow_set_val();
extern void sprow_foutput();
extern int sprow_idx(), sprow_free();
/* dump */
extern void sp_dump(), sprow_dump();
extern MAT *sp_m2dense();
#else
SPMAT *sp_get(int,int,int), *sp_copy(SPMAT *),
*sp_copy2(SPMAT *,SPMAT *),
*sp_zero(SPMAT *), *sp_resize(SPMAT *,int,int),
*sp_compact(SPMAT *,double);
double sp_get_val(SPMAT *,int,int), sp_set_val(SPMAT *,int,int,double);
VEC *sp_mv_mlt(SPMAT *,VEC *,VEC *), *sp_vm_mlt(SPMAT *,VEC *,VEC *);
int sp_free(SPMAT *);
/* Access path operations */
SPMAT *sp_col_access(SPMAT *);
SPMAT *sp_diag_access(SPMAT *);
int chk_col_access(SPMAT *);
/* Input/output operations */
SPMAT *sp_finput(FILE *);
void sp_foutput(FILE *,SPMAT *), sp_foutput2(FILE *,SPMAT *);
/* algebraic operations */
SPMAT *sp_smlt(SPMAT *A,double alpha,SPMAT *B),
*sp_add(SPMAT *A,SPMAT *B,SPMAT *C),
*sp_sub(SPMAT *A,SPMAT *B,SPMAT *C),
*sp_mltadd(SPMAT *A,SPMAT *B,double alpha,SPMAT *C);
/* sparse row operations */
SPROW *sprow_get(int), *sprow_xpd(SPROW *r,int n,int type),
*sprow_resize(SPROW *r,int n,int type),
*sprow_merge(SPROW *,SPROW *,SPROW *,int type),
*sprow_copy(SPROW *,SPROW *,SPROW *,int type),
*sprow_mltadd(SPROW *,SPROW *,double,int,SPROW *,int type);
SPROW *sprow_add(SPROW *r1,SPROW *r2, int j0,SPROW *r_out, int type),
*sprow_sub(SPROW *r1,SPROW *r2, int j0,SPROW *r_out, int type),
*sprow_smlt(SPROW *r1,double alpha, int j0,SPROW *r_out, int type);
double sprow_set_val(SPROW *,int,double);
int sprow_free(SPROW *);
int sprow_idx(SPROW *,int);
void sprow_foutput(FILE *,SPROW *);
/* dump */
void sp_dump(FILE *fp, SPMAT *A);
void sprow_dump(FILE *fp, SPROW *r);
MAT *sp_m2dense(SPMAT *A,MAT *out);
#endif
/* MACROS */
#define sp_input() sp_finput(stdin)
#define sp_output(A) sp_foutput(stdout,(A))
#define sp_output2(A) sp_foutput2(stdout,(A))
#define row_mltadd(r1,r2,alpha,out) sprow_mltadd(r1,r2,alpha,0,out)
#define out_row(r) sprow_foutput(stdout,(r))
#define SP_FREE(A) ( sp_free((A)), (A)=(SPMAT *)NULL)
/* utility for index computations -- ensures index returned >= 0 */
#define fixindex(idx) ((idx) == -1 ? (error(E_BOUNDS,"fixindex"),0) : \
(idx) < 0 ? -((idx)+2) : (idx))
/* NOT USED */
/* loop over the columns in a row */
/*
#define loop_cols(r,e,code) \
do { int _r_idx; row_elt *e; SPROW *_t_row; \
_t_row = (r); e = &(_t_row->elt); \
for ( _r_idx = 0; _r_idx < _t_row->len; _r_idx++, e++ ) \
{ code; } } while ( 0 )
*/
/* loop over the rows in a column */
/*
#define loop_cols(A,col,e,code) \
do { int _r_num, _r_idx, _c; SPROW *_r; row_elt *e; \
if ( ! (A)->flag_col ) sp_col_access((A)); \
col_num = (col); \
if ( col_num < 0 || col_num >= A->n ) \
error(E_BOUNDS,"loop_cols"); \
_r_num = (A)->start_row[_c]; _r_idx = (A)->start_idx[_c]; \
while ( _r_num >= 0 ) { \
_r = &((A)->row[_r_num]); \
_r_idx = sprow_idx2(_r,_c,_r_idx); \
if ( _r_idx < 0 ) continue; \
e = &(_r->elt[_r_idx]); code; \
_r_num = e->nxt_row; _r_idx = e->nxt_idx; \
} } while ( 0 )
*/
#endif